﻿// 601 数位和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;
/*
http://oj.daimayuan.top/course/5/problem/245
读入 l,r，请求出 0...9 这些数字在 [l,r]的数位中分别出现了多少次。

输入格式
一行两个整数 l,r。

输出格式
一行 10 个数字，第 i个数字表示 i−1在 [l,r]的数位中出现的次数。

样例输入
1 100
样例输出
11 21 20 20 20 20 20 20 20 20
数据范围
对于 100%
 的数据，保证 1≤l≤r≤1016。
*/
int c[21];
long long  l, r, ans[10], f[17];


void calc(long long n, int xs) {
	int m = 0;
	for (; n; n /= 10)
		c[++m] = n % 10;
	//c[x]记录n的数字  记录时反向 ， 后又做了翻转
	for (int i = 1, j = m; i < j; i++, j--) {
		swap(c[i], c[j]);
	}

	//n=123456  此从索引1 到6 开始检测
	for (int i = 1; i <= m; i++) {
		// i = 4 时候  
		//1 2 3 均可以索引1到3出现 400次(123 受索引4 上的影响 也就是 索引4上面对123出现的贡献)
		for (int j = 1; j < i; j++) {
			ans[c[j]] += xs * c[i] * f[m - i];
		}

		//123 4 56  索引4这个位置 填 写 1 2 3 的贡献
		for (int j = 1; j < c[i]; j++) {
			ans[j] += xs * f[m - i];
		}

		//当前索引不是第一个(索引4)   0 可以出现 100次  
		if (i != 1 && c[i])
			ans[0] += xs * f[m - i];

		//当前不是最后一个数字 不是个位  所有大于i的位置 对于答案的贡献
		if (m != i) {
			for (int j = 1; j < 10; j++)
				ans[j] += xs * f[m - i - 1] * (m - i) * c[i];
			if (i != 1)
				ans[0] += xs * f[m - i - 1] * (m - i) * c[i];
		}
		
		if (i == 1) {
			if (m >= 2)
				ans[0] += xs * (c[1] - 1) * (m - 1) * f[m - 2];
			for (int j = 2; j < m; j++)
				ans[0] += xs * 9 * (m - j) * f[m - j - 1];
		}
	}

	for (int i = 1; i <= m; i++)
		ans[c[i]] += xs;
}


int main()
{
	f[0] = 1;
	for (int i = 1; i <= 16; i++)
		f[i] = f[i - 1] * 10;
	scanf("%lld%lld", &l, &r);
	calc(r, 1);
	calc(l - 1, -1);
	for (int i = 0; i < 10; i++) {
		printf("%lld ", ans[i]);
	}
	printf("\n");


	return 0;
}